﻿using System;
using System.Collections.Generic;
using System.Web.Mvc;
using Contact.DAL.Models.Worktime;
using ContactMvc4TB.Helpers.HelperClasses;
using ContactMvc4TB.Helpers.RightsManagement;
using ContactMvc4TB.Models.Worktime.Helpers;
using EFDataModel;
using System.Linq;
using EFDataModel.Enums;
using GlobalResources;

namespace ContactMvc4TB.Models.Worktime
{
    /// <summary>
    /// Model zum Erstellen eines neuen Urlaubseintrags für einen User.
    /// </summary>
    public class HolidayCreateModel : HolidayEntry
    {
        #region Modeldata
        /// <summary>
        /// Die aktuelle UserId für die der Eintrag angelegt/ bearbeitet werden soll
        /// </summary>
        public long UserId { get; set; }
        #endregion

        #region Public Functions
        /// <summary>
        /// Laden der Modeldaten für die übergebene Id.
        /// </summary>
        /// <param name="controller">Das aktuelle Controller Objekt </param>
        /// <param name="yearId">Die JahresId die bearbeitet werden soll</param>
        /// <param name="userId">die zugehörige UserId</param>
        /// <returns>TRUE->Laden erfolgreich | FALSE->Fehler beim Laden</returns>
        public bool LoadModelData(Controller controller, int yearId, long userId)
        {
            UserId = userId;

            //Wenn die JahresId 0 ist, dann handelt es sich um einen neuen Eintrag, der angelegt werden soll.
            if (yearId == 0)
            {
                Id = 0;
                Year = DateTime.Now.Year;
                Days = 24;
                return true;
            }
            else
            {
                WorktimeSettingsRepository repository = new WorktimeSettingsRepository(CurrentHttpContext.GetDataModel());
                HolidayDays holiday = repository.LoadHoliday(yearId);
                if (holiday != null)
                {
                    //Achtung hier muss ebenfalls überprüft werden, ob der User das Recht hat die Daten anderer Nutzer zu bearbeiten
                    //Wenn nicht muss die UserId mit der JahresId übereinstimmen, sonst versucht jmd die Daten eines anderen zu bearbeiten.
                    if (WebRights.Right().Check(EUserRights.WorktimeSettingsEdit) || holiday.EFWorktimeSetting.EFAuthentication.ID == userId)
                    {
                        Id = holiday.ID;
                        Year = holiday.Year;
                        Days = holiday.Days;
                        return true;
                    }
                    else
                    {
                        CustomMessage.CurrentMessage(controller).AddMessage(SystemMessages.NoRightToEditHolidayEntries, MessageTypes.error);
                        EFDebugging.Debugging.WriteLog(string.Format("Der User '{0}' hat kein Recht die Urlaubseinträge zu bearbeiten.", CurrentSession.GetCurrentUser().ID));
                    }
                }

                //Fehler beim Laden, der Eintrag konnte nicht gefunden werden.
                return false;
            }
        }

        /// <summary>
        /// Speichern der passenden Modeldaten
        /// </summary>
        /// <param name="controller">Das aktuelle Controller Objekt</param>
        /// <param name="yearId">Die JahresId, wenn eine vorhanden ist</param>
        /// <param name="userId">Die UserId für die der Eintrag angelegt werden soll</param>
        public bool SaveModelData(Controller controller, int yearId, long userId)
        {
            //Achtung hier muss ebenfalls überprüft werden, ob der User das Recht hat die Daten anderer Nutzer zu bearbeiten
            //Wenn nicht muss die UserId mit der aktuellen UserId übereinstimmen die eingeloggt ist, sonst versucht jmd die Daten eines anderen zu bearbeiten.
            if (WebRights.Right().Check(EUserRights.WorktimeSettingsEdit) || CurrentSession.GetCurrentUser().ID == userId)
            {
                WorktimeSettingsRepository repository = new WorktimeSettingsRepository(CurrentHttpContext.GetDataModel());
                HolidayDays holiday = new HolidayDays();
                if (Id != 0)
                {
                    holiday = repository.LoadHoliday(Id);
                    //Prüfen ob der Eintrag auch geladen werden konnte.
                    if (holiday == null)
                    {
                        CustomMessage.CurrentMessage(controller).AddMessage(SystemMessages.HolidayEntryNotFound, MessageTypes.error);
                        return false;
                    }
                }

                //Prüfen ob das Jahr bereits existiert, was gesetzt bzw. erstellt werden soll.
                List<HolidayDays> holidays = repository.LoadHolidays(userId);
                if (holidays.Any(p=>p.Year == Year && p.ID != Id))
                {
                    CustomMessage.CurrentMessage(controller).AddMessage(SystemMessages.YearExistsError, MessageTypes.error);
                    return false;
                }

                //Anpassen der Werte.
                holiday.Year = Year;
                holiday.Days = Days;
                //Speichern der Werte.
                if (repository.SaveHoliday(holiday, userId))
                {
                    CustomMessage.CurrentMessage(controller).AddMessage(SystemMessages.SaveSuccessfullRESX, MessageTypes.ok);
                    return true;
                }
            }
            else
            {
                CustomMessage.CurrentMessage(controller).AddMessage(SystemMessages.NoRightToEditHolidayEntries, MessageTypes.error);
            }

            CustomMessage.CurrentMessage(controller).AddMessage(SystemMessages.SaveError, MessageTypes.error);
            return false;
        }
        #endregion

        #region Private Functions

        #endregion
    }
}